/*
	在Domain对象中嵌套使用另一个Domain对象
*/

var domain = require('domain');

var d1 = domain.create();
d1.name = 'd1';
d1.on('error', function (err) {
	console.log('d1对象捕获到错误');
});

var d2 = domain.create();
d2.name = 'd2';
d2.on('error', function (err) {
	console.log('d2对象捕获到错误');
});


console.log('原始堆栈：');
console.log(domain._stack);


// d2对象的run方法中抛出的错误被d2对象捕获
// d1.run(function () {
// 	d2.run(function () {
// 		console.log('最终堆栈：');
// 		console.log(domain._stack);
// 		throw new Error('first');
// 	});
// });
/*
原始堆栈：
[]
最终堆栈：
[ { domain: null,
    _events: { error: [Function] },
    _maxListeners: 10,
    members: [],
    name: 'd1' },
  { domain: null,
    _events: { error: [Function] },
    _maxListeners: 10,
    members: [],
    name: 'd2' } ]
d2对象捕获到错误
*/






// 在d2对象的run方法中使用d1对象的enter方法，把d1对象推入domain堆栈的最顶层，
// 在使用了d1对象的enter方法之后抛出的错误被d1捕获
// d1.run(function () {
// 	d2.run(function () {
// 		d1.enter();
// 		console.log('最终堆栈：');
// 		console.log(domain._stack);
// 		throw new Error('first');
// 	});
// });
/*
原始堆栈：
[]
最终堆栈：
[ { domain: null,
    _events: { error: [Function] },
    _maxListeners: 10,
    members: [],
    name: 'd1' },
  { domain: null,
    _events: { error: [Function] },
    _maxListeners: 10,
    members: [],
    name: 'd2' },
  { domain: null,
    _events: { error: [Function] },
    _maxListeners: 10,
    members: [],
    name: 'd1' } ]
d1对象捕获到错误
*/





// 如果在Domain对象中嵌套使用其他Domain对象，则在最外层的Domain对象的exit方法被调用后，
// 该对象及其内部嵌套的所有Domain对象都被弹出domain堆栈，所有被弹出的Domain对象都不能再捕获任何错误
// 在d2对象的run方法中使用d1对象的exit方法，
d1.run(function () {
	d2.run(function () {
		d1.exit();
		console.log('最终堆栈：');
		console.log(domain._stack);
		// throw new Error('first');
	});
});
/*
原始堆栈：
[]
最终堆栈：
[]
*/